#ifndef LECTEURPHRASEAVECTABLE_H_
#define LECTEURPHRASEAVECTABLE_H_

#include "LecteurSymbole.h"
#include "TableSymboles.h"
#include <string>
using namespace std;

class LecteurPhraseAvecTable {
public:
	LecteurPhraseAvecTable(string nomFich);	// Construit un lecteur de phrase pour vérifier
	                                        // la syntaxe du programme dans le fichier nomFich

	void analyse();   // Si le contenu du fichier est conforme à la grammaire,
	                  //   cette méthode se termine normalement et affiche un message "Syntaxe correcte".
                          //   la table des symboles (ts) aura été construite
	                  // Sinon, le programme sera interrompu (exit).
	inline TableSymboles getTs ()   { return ts; } // accesseur

private:
    LecteurSymbole ls;  // le lecteur de symboles utilisé pour analyser le fichier
    TableSymboles  ts;  // la table des symboles valués

       // implémentation de la grammaire
    void programme();           //      <programme>     ::= debut <seqInst> fin <EOF>
    void seqInst();             //      <seq_ins>       ::= <inst> ; { <inst> ; }
    void inst();                //      <inst>          ::= <affectation> | | <instSi> | <instTq> | <instRepeter> |<instlire> |<instEcrire> | <instPour>
    void affectation();         //      <affectation>   ::= <variable> = <expression> | <chaine>
    void instSi();              //      <instSi>        ::= si ( <expBool> ) <seqInst> { sinonsi ( <expBool> ) <seqInst> }[ sinon <seqInst> ] finsi
    void instSwitch();          //      <instSwitch>    ::= switch ( <variable> ) case (<entier>) <seqinst>  { case (<entier>) <seqinst> }
    void instTq();              //      <instTq>        ::= tantque ( <expBool> ) <seqInst> fintantque
    void instLire();            //      <instLire>      ::= lire ( <variable> )
    void instEcrire();          //      <instEcrire>    ::= ecrire ( <expression> | <chaine> )
    void instEcrire_Ligne();    //      <instEcrire_Ligne>    ::= ecrire ( <expression> | <chaine> )
    void instRepeter();         //      <instRepeter>   ::= repeter <seqInst> jusqua ( <expBool> )
    void instPour();            //      <instPour>      ::= pour <variable> dans <expression>..<expression> faire <Seqinst> finpour
    void expBool();             //      <expBool>       ::=<expArith> { <opOu> <expArith> }
    void expArith();            //      <expArith       ::=<relation { <opEt> <relation> }
    void relation();            //      <relation       ::=<expression> { <opReel> <expression> }
    void expression();          //      <expression>    ::= <terme> { <opAdd> <terme> }
    void terme();               //      <terme          ::= <facteur> { <opMult> facteur> }
    void facteur();             //      <facteur>       ::= <entier>  |  <variable>  | <opUnaire> <expBool> | ( <expBool> )
    void opEt();                //      et 
    void opOu();
    void opBool();              //      == | != | <= | >= | < | >
    void opAdd();               //      +|-
    void opMult();              //       * | /
    void opUnaire();            //       - | non
    
    
    void sauterCommentaire();   //      outils pour se simplifier l'analyse syntaxique
    void testerSymCour(string ch); // si symbole courant != ch, erreur : on arrete le programme, sinon rien
    void sauterSymCour(string ch); // si symbole courant == ch, on passe au symbole suivant, sinon erreur : on arrete
    void erreur(string mess); // affiche les message d'erreur mess et arrete le programme
};

#endif /* LECTEURPHRASEAVECTABLE_H_ */
